package com.fbinggun.fbinggunutil.API;

import com.fbinggun.fbinggunutil.utilclass.Variable;
import io.lumine.mythic.bukkit.utils.lib.jooq.impl.QOM;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;

/**
 * 字符串处理 变量计算 常用方法
 */
public class JavaUtil {

    //通过replace分隔符 将字符串转List

    /**
     * 将字符串转为 List<String>
     * @param str 字符串
     * @param replace 分隔符
     * @return
     */
    public static List<String> toList(String str,String replace){
        String[] args = str.split(replace);
        List<String> list = new ArrayList<>();
        for(String str2:args){
            list.add(str2);
        }
        return list;
    }

    /**
     * 将List<String> 转为字符串
     * @param list
     * @param replace 分隔符
     * @return
     */
    //通过replace分隔符 将List转字符串
    public static String listToString(List<String> list,String replace){
        String str = "";
        for(String str2:list){
          str=str+str2+replace;
        }
        return str;
    }

    //判断变量条件

    /**
     * 判断公式 布尔值
     * 例如：
     *     %Player_name%==Binggun
     *     %player_level<=1%||%Player_name%==Binggun
     *     %player_level<=1%&&%Player_name%==Binggun
     * @param player 玩家
     * @param formulas 公式
     * @return
     * @throws Exception
     */
    public static boolean isRunnerAll(Player player, String formulas) throws Exception {
        if (formulas.contains("&&")) {
            String[] formulass = formulas.split("&&");
            for (String formula : formulass) {
                if (!isRunner(player, formula)) {
                    return false;
                }

            }
            return true;
        }else
        if (formulas.contains("||")) {
            String[] formulass = formulas.split("\\|\\|");
            for (String formula : formulass) {
                if (isRunner(player, formula)) {
                    return true;
                }

            }
            return false;
        }else {
            return isRunner(player,formulas);
        }
    }

    /**
     * 判断公式 布尔值
     * 例如：
     *     %Player_name%==Binggun
     *     %player_level%<=1
     *     %player_level%<=1
     * @param player 玩家
     * @param formula 公式
     * @return
     * @throws Exception
     */
    public static boolean isRunner(Player player, String formula) {

        return new Exp4jAPI().isRunner( PApiUtil.setPlaceholders(player,formula));
    }


    /**
     * 计算公式
     * 例如：
     *     %player_level%*100
     * @param player 玩家
     * @param formula 公式
     * @return
     */
    //计算 变量公式
    public static double calculate(Player player,String formula, Variable... variable) {
        if(PluginUtil.isPlaceholderAPI()) {
            formula = PApiUtil.setPlaceholders(player, formula);
        }
        return new Exp4jAPI().calculate(formula,variable);
    }

    /**
     * 替换彩色字符 与本地变量
     * @param str 字符串
     * @param variable 变量 可为空
     * @return
     */
    //替换彩色字符与变量
    public static String replaceColor(String str, Variable... variable){
        str=str.replaceAll("&","§");
        if(variable!=null){
            for(Variable v:variable ){
                str=str.replaceAll(v.getKey(), v.getValue());
            }
        }
        return str;
    }

    /**
     * 替换彩色字符
     * @param str
     * @return
     */
    //替换彩色字符
    public static String replaceColor(String str){
       return replaceColor(str,null);
    }
    /**
     * 替换彩色字符
     * @param list
     * @return
     */
    //替换彩色字符
    public static List<String> replaceColor(List<String> list){
        return replaceColor(list,null);
    }
    /**
     * 替换彩色字符
     * @param list
     * @param variable 变量
     * @return
     */
    //替换彩色字符与变量
    public static List<String> replaceColor(List<String> list,Variable... variable){
        List<String> ls = new ArrayList<>();
        for(String str:list) {
            str = str.replaceAll("&", "§");
            if(variable!=null){
                for(Variable v:variable ){
                    str=str.replaceAll(v.getKey(), v.getValue());
                }
            }
            ls.add(str);
        }
        return ls;
    }
}
